package com.atguigu.weixin.kit;

import java.io.IOException;
import java.util.Map;

import com.atguigu.crud.bean.Wxmenu;
import com.atguigu.crud.bean.Wxqr;
import com.atguigu.crud.bean.Wxuser;
import com.atguigu.crud.service.WxgroupService;
import com.atguigu.crud.service.WxmenuService;
import com.atguigu.crud.service.WxqrService;
import com.atguigu.crud.service.WxuserService;
import com.atguigu.weixin.model.WeixinFianlValue;
import com.atguigu.weixin.model.WeixinUser;
import com.atguigu.weixin.msg.MessageKit;
import com.atguigu.weixin.servlet.BeanFactoryContext;
import com.atguigu.weixin.user.model.WGroup;

public class WeixinEventKit {
	/**
	 * 获取场景值  信息
	 * @return
	 * 了解：用户未关注时，进行关注后的事件推送
	 */
	@SuppressWarnings("unused")
	private static String getSence(Map<String,String> msgMap,boolean subscribe){//
		String key=msgMap.get("EventKey");
		if(key==null||"".equals(key))return null;
		if(subscribe){//如果是关注的
			return key.split("_")[1];
		}else 
			return key;
	}
	
	public static String handlerEventMsg(Map<String, String> msgMap) throws IOException {
		String event = msgMap.get("Event");
		System.out.println(event);
		if("CLICK".equals(event)) {
			return handlerClickEvent(msgMap);//click事件
		} else if("SCAN".equals(event)) {//扫描  已经关注之后执行scan方法
			return handlerScanEvent(msgMap);
		} else if("subscribe".equals(event)) {//subscribe
			//用户关注事件
			return handlerSubscribeEvent(msgMap);
		} else if("unsubscribe".equals(event)) {
			//取消关注事件
			return handlerUnsubscribeEvent(msgMap);
		}
		return null;
	}

	/**
	 * 处理我们的用户信息 公共类
	 */
	private static Wxuser handerUserInfo(Map<String, String> msgMap){
		 String openid=msgMap.get("FromUserName");
		 //initservlet初始化了业务类
		 WxuserService wxUserService = (WxuserService)BeanFactoryContext.getService("wxuserService");
		 //WeixinUser u=wxUserService.queryByOpenid(openid);
		 Wxuser u=wxUserService.loadByOpenid(openid);//先查询数据库是否存在
		if(u==null){//如果不存在
			WeixinUser wu=wxUserService.queryByOpenid(openid);//调用微信接口
		    u=wu.getUser();
		    wxUserService.add(u);//接口返回的数据插入到数据中
		}else{
		   if(u.getStatus()==0){//如果未关注
			   u.setStatus(1);//开启关注，取消关注的时候 把状态变为0
			   wxUserService.update(u);//更新数据库
		   }
		}
		
		return u;
 	}
	
	/**
	 * 考虑问题1、有可能数据库没有这个用户
	 * @param msgMap
	 * @return
	 * @throws IOException 
	 */
  private static String handlerScanEvent(Map<String, String> msgMap) throws IOException {
	     handerUserInfo(msgMap);
		 String snum=getSence(msgMap,false);//场景值
		 String openid=msgMap.get("FromUserName");
		 WxqrService wxqrService = (WxqrService)BeanFactoryContext.getService("wxqrService");
		 Wxqr wq= wxqrService.loadBySnum(Integer.parseInt(snum));//查询数据库看有没有 ，是否关注
		 if(wq.getType()==WeixinFianlValue.REPASSWORD_TYPE){  //type 自己定义的类型  之后确定什么操作
			 //处理修改密码操作
			 return MessageKit.map2xml(MessageCreateKit.createTextMsg(msgMap,"<a href=\""+wq.getQrdata()+"\">"+wq.getMsg()+"</a>"));
		 }else if(wq.getType()==WeixinFianlValue.SET_GROUP_TYPE){
			 //处理设置用户组的操作
			 WxgroupService wxgroupService = (WxgroupService)BeanFactoryContext.getService("wxgroupService");
			 
			 wxgroupService.moveUserToGroup(openid, Integer.parseInt(wq.getQrdata()));
			 
			 WGroup wg=wxgroupService.queryUserGroup(openid);
			 
			 return MessageKit.map2xml(MessageCreateKit.createTextMsg(msgMap,"你的用户组已经修改,用户组修改为："+wg.getName()));
			 
		 }else if(wq.getType()==WeixinFianlValue.TEMP_BIND){
			 //处理绑定用户操作
		 }else if(wq.getType()==WeixinFianlValue.TEMP_LOGIN){
			 //处理用户扫码登录操作  
			 //判断临时二维码是否超期 60 秒
			 long t=System.currentTimeMillis()-wq.getCrdatedate().getTime();
			 
			 if(t/1000>60){//如果过期  超过60秒
				return  MessageKit.map2xml(MessageCreateKit.createTextMsg(msgMap,"你所扫描的二维码已经过期，请在网页中重新刷新并且扫描"));
			 }else{//如果没有过期 
				 wq.setStatus(1);
				 wq.setQrdata(openid);
				 wxqrService.update(wq);
			 }
		 }
		 
		return null;
	}

private static  Wxuser getUser(Map<String,String> msgMap){
		 String openid=msgMap.get("FromUserName");
		 //initservlet初始化了业务类
		 WxuserService wxUserService = (WxuserService)BeanFactoryContext.getService("wxuserService");
		 //WeixinUser u=wxUserService.queryByOpenid(openid);
		 Wxuser u=wxUserService.loadByOpenid(openid);//先查询数据库是否存在
		 return u;
  }
	
	//用户取消
	private static String handlerUnsubscribeEvent(Map<String, String> msgMap) {
		 Wxuser u = getUser(msgMap);
		 WxuserService wxUserService = (WxuserService)BeanFactoryContext.getService("wxuserService");
		if(u!=null) {
			u.setStatus(0);
			wxUserService.update(u);
		}
		return null;
	}
	
	//用户关注事件
		private static String handlerSubscribeEvent(Map<String, String> msgMap) throws IOException {
			 Wxuser u = handerUserInfo(msgMap);
			 String snum=getSence(msgMap,true);//场景值
			 String openid=msgMap.get("FromUserName");
			 //未关注的时候
			 if(snum!=null){//场景值不为空
				 WxqrService wxqrService = (WxqrService)BeanFactoryContext.getService("wxqrService");
				 Wxqr wq= wxqrService.loadBySnum(Integer.parseInt(snum));//查询数据库看有没有 ，是否关注
				 WxgroupService wxgroupService = (WxgroupService)BeanFactoryContext.getService("wxgroupService");
				 if(wq.getType()==WeixinFianlValue.SET_GROUP_TYPE){//微信测试帐号移到 测试组2里面去
					 wxgroupService.moveUserToGroup(openid, Integer.parseInt(wq.getQrdata())); //用户扫描一进来就把用户 归到 提前设定的分组 qrdata  的值中
				 }
			 }
			if(u.getBind()==0){//如果没有绑定
				String bindUrl="http://flyljxin.imwork.net/weixinUser/bindExistUser";
				return MessageKit.map2xml(MessageCreateKit.createTextMsg(msgMap,"<a href=\""+bindUrl+"\">请点击绑定用户获得更好的体验</a>"));
			}else {
				String bindUrl = "https://www.xkzb.wang/";
				String uurl="<a href=\""+bindUrl+"\">欢迎你再次使用我们的微信平台，点击打开我们的页面</a>";
				StringBuffer buffer = new StringBuffer();  
			    buffer.append("您好，我是小q，请回复数字选择服务：").append("\n\n");  
			    buffer.append("1  天气预报").append("\n");  
			    buffer.append("2  公交查询").append("\n");  
			    buffer.append("3  周边搜索").append("\n");  
			    buffer.append("4  歌曲点播").append("\n");  
			    buffer.append("5  经典游戏").append("\n");  
			    buffer.append("6  美女电台").append("\n");  
			    buffer.append("7  人脸识别").append("\n");  
			    buffer.append(uurl).append("\n");  
			    buffer.append("8  聊天唠嗑").append("\n\n");  
			    buffer.append("回复“?”显示此帮助菜单");  
				return MessageKit.map2xml(MessageCreateKit.createTextMsg(msgMap, buffer.toString()));
			}
			
		}
	
	/**
	 * 根据菜单的单击click事件来 去查询数据库里 对应  content 字段 的内容。可以自定义配置
	 * @param msgMap
	 * @return
	 * @throws IOException
	 */
	private static String handlerClickEvent(Map<String, String> msgMap) throws IOException {
		String keyCode = msgMap.get("EventKey");
		//initservlet初始化了业务类
		WxmenuService wxmenuService = (WxmenuService)BeanFactoryContext.getService("wxmenuService");
		Wxmenu wm = wxmenuService.getwxmenu(keyCode);
		if(wm!=null&&wm.getRespontype()==1) {
			/**
			 * 1、数据里来保存 对应类型  然后再取出content 内容  再把信息转成微信可以识别的xml 内容  
			 * 2、参照微信接口 xml 数规范
			 */
			Map<String,Object> map = MessageCreateKit.createTextMsg(msgMap, wm.getContent());
			return MessageKit.map2xml(map);
		}
		return null;
	}
}
